
# coding: utf-8

# In[1]:

import os
os.chdir('D:/PatentData/2016/rawdata')
os.getcwd()
import codecs

# In[2]:

from xml.dom.minidom import parse, parseString
import re

def process_single_xml_file(filename, writeon):
    xml_file = codecs.open(filename, 'r', 'iso-8859-1').read()
    xml_list = re.split('<\?xml.*?\?>', xml_file)    # 한 xml_file을 특허별로 나누어줌
    
    index = 1

    for one_xml in xml_list:

        if index > 1:
            
            dom = parseString(one_xml)
            publ = dom.getElementsByTagName("publication-reference")[0]
            pid = publ.getElementsByTagName("doc-number")[0].firstChild.nodeValue
            
            if len(dom.getElementsByTagName("inventors")) > 0:
                group = dom.getElementsByTagName("inventors")[0]
                invts = group.getElementsByTagName("inventor")
            else: continue
            
            for invt in invts:
                
                if len(invt.getElementsByTagName("first-name")) > 0 and len(invt.getElementsByTagName("last-name")) > 0:
                    first = invt.getElementsByTagName("first-name")[0].firstChild.nodeValue
                    last = invt.getElementsByTagName("last-name")[0].firstChild.nodeValue
                    nam_invt = first + ' ' + last
                
                elif len(invt.getElementsByTagName("first-name")) > 0:
                    nam_invt = invt.getElementsByTagName("first-name")[0].firstChild.nodeValue
                    
                elif len(invt.getElementsByTagName("last-name")) > 0:
                    nam_invt = invt.getElementsByTagName("last-name")[0].firstChild.nodeValue
                
                if len(invt.getElementsByTagName("address")) > 0:
                    addr = invt.getElementsByTagName("address")[0]
                    cntr = addr.getElementsByTagName("country")[0].firstChild.nodeValue
                
                    if cntr != "US" and cntr != "us" and cntr != "USA":    # 미국이 아니면 cnt만 적고 sta, cty는 버림 
                        writeon.write(pid + '*' + nam_invt + '*' + cntr + '*' + '' + '*' + '' + '\n')
                
                    else:    # 미국이면 sta, cty만 적음
                        state, city = '', ''
                    
                        if len(addr.getElementsByTagName("state")) > 0:
                            state = addr.getElementsByTagName("state")[0].firstChild.nodeValue
                        
                        if len(addr.getElementsByTagName("city")) > 0:
                            city = addr.getElementsByTagName("city")[0].firstChild.nodeValue
                        
                        writeon.write(pid + '*' + nam_invt + '*' + '' + '*' + state + '*' + city + '\n')
                        
                else: writeon.write(pid + '*' + nam_invt + '*' + 'None' + '*' + 'None' + '*' + 'None' + '\n')
                        # 주소가 없는 경우는 cntr, sta, cty 모두 'None'으로 적음
                    
            # print(pid)    # 문제가 발생한 특허를 확인하려면 이 기능을 키고 돌릴 것
        index += 1


# In[3]:

import sys

def select_files_in_folder(dir, ext):
    for file in os.listdir(dir):    # 'dir'에 있는 모든 파일들 이름으로 list를 만듦
        if file.endswith('.%s' % ext):    # 확장자가 .ext인 파일일 경우 True
            yield os.path.join(dir, file)    # 'dir/file' 형태의 새로운 dir를 뱉어냄
            
# 'dir' 안에 확장자가 '.ext'인 모든 file들로 이루어진 generator(한번 iterate 시키고 나면 사라지는 list)를 만드는 함수


# In[5]:

file = codecs.open("invent_2016_new.csv", 'w', 'utf8')
file.write("WKU*NAM_INVT*CNT*STA*CTY\n")

for xmlfile in select_files_in_folder('D:/PatentData/2016/rawdata', 'xml'):
    print("PROCESSING...", xmlfile)
    process_single_xml_file(xmlfile, file)

print("DONE")


# In[ ]:



